Skip to content

Commit

Permalink
dj64: add __out annotations support
Browse files Browse the repository at this point in the history
This is needed to properly shut up valgrind.
Other valgrind hacks should be removed.
  • Loading branch information
stsp committed Aug 8, 2024
1 parent 33ac36e commit 06105b3
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 3 deletions.
1 change: 1 addition & 0 deletions include/dj64/thunks_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ uint64_t dj64_asm_call_u(int handle, int num, uint8_t *sp, uint8_t len,
int flags);
uint8_t *dj64_clean_stk(size_t len);
uint32_t dj64_obj_init(const void *data, uint16_t len);
uint32_t dj64_obj_oinit(const void *data, uint16_t len);
void dj64_obj_done(void *data, uint32_t fa, uint16_t len);
void dj64_rm_dosobj(const void *data, uint32_t fa);

Expand Down
2 changes: 2 additions & 0 deletions include/dj64/thunks_p.inc
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
#define __CSTK(l) dj64_clean_stk(l)

#define __CNV_PTR(t, d, f, l, t0) t d = dj64_obj_init(f, l)
#define __CNV_OPTR(t, d, f, l, t0) t d = dj64_obj_oinit(f, l)
#define __CNV_CPTR(t, d, f, l, t0) t d = dj64_obj_init(f, l)
#define __CNV_PTR_CCHAR(t, d, f, l, t0) t d = dj64_obj_init(f, strlen(f) + 1)
#define __CNV_CHAR_ARR(t, d, f, l, t0) t d = dj64_obj_init(f, l)
Expand All @@ -64,6 +65,7 @@
#define _L_SZ(n) sizeof(*a##n)

#define U__CNV_PTR(f, d, l) dj64_obj_done(f, d, l)
#define U__CNV_OPTR(f, d, l) dj64_obj_done(f, d, l)
#define U__CNV_CPTR(f, d, l) dj64_rm_dosobj(f, d)
#define U__CNV_PTR_CCHAR(f, d, l) dj64_rm_dosobj(f, d)
#define U__CNV_PTR_CHAR(f, d, l) dj64_obj_done(f, d, strlen(DATA_PTR(d)) + 1)
Expand Down
2 changes: 1 addition & 1 deletion include/dpmi.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ int __dpmi_allocate_ldt_descriptors(int _count); /* DPMI 0.9 AX=0000 */
int __dpmi_free_ldt_descriptor(int _descriptor); /* DPMI 0.9 AX=0001 */
int __dpmi_segment_to_descriptor(int _segment); /* DPMI 0.9 AX=0002 */
int __dpmi_get_selector_increment_value(void); /* DPMI 0.9 AX=0003 */
int __dpmi_get_segment_base_address(int _selector, ULONG32 *_addr); /* DPMI 0.9 AX=0006 */
int __dpmi_get_segment_base_address(int _selector, __out ULONG32 *_addr); /* DPMI 0.9 AX=0006 */
int __dpmi_set_segment_base_address(int _selector, ULONG32 _address); /* DPMI 0.9 AX=0007 */
ULONG32 __dpmi_get_segment_limit(int _selector); /* LSL instruction */
int __dpmi_set_segment_limit(int _selector, ULONG32 _limit); /* DPMI 0.9 AX=0008 */
Expand Down
2 changes: 2 additions & 0 deletions include/libc/asmobj.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,3 +115,5 @@ t *__##x(void) \
#define EXTERN

#endif

#define __out
15 changes: 13 additions & 2 deletions src/libc/dj64/thunks.c
Original file line number Diff line number Diff line change
Expand Up @@ -431,18 +431,29 @@ static uint32_t *find_oh(uint32_t addr)
return NULL; // should not happen
}

uint32_t dj64_obj_init(const void *data, uint16_t len)
static uint32_t do_obj_init(const void *data, uint16_t len, int is_out)
{
uint32_t ret;
if (dj64api->is_dos_ptr(data))
return PTR_DATA(data);
ret = mk_dosobj(len);
pr_dosobj(ret, data, len);
if (!is_out)
pr_dosobj(ret, data, len);
objcnt++;
*find_oh(0) = ret;
return ret;
}

uint32_t dj64_obj_init(const void *data, uint16_t len)
{
return do_obj_init(data, len, 0);
}

uint32_t dj64_obj_oinit(const void *data, uint16_t len)
{
return do_obj_init(data, len, 1);
}

void dj64_obj_done(void *data, uint32_t fa, uint16_t len)
{
if (dj64api->is_dos_ptr(data))
Expand Down

0 comments on commit 06105b3

Please sign in to comment.